package array;

import java.util.Arrays;

//7.数组
public class java2_27 {
    public static void main(String[] args) {
//        int [] arr1 = new int []{1,2,3};//new出了一个数组,并且创建引用指向这个数组
//        int [] arr2 = arr1;//没有new数组,而是创建了一个引用,这个引用指向的是刚才的数组
//        arr2[0] = 100;//通过引用改变了它们两个指向的数组
//        arr2[1] = 200;
//        System.out.println(Arrays.toString(arr1));
//        System.out.println(Arrays.toString(arr2));
//        //arr2和arr1指向的是同一个数组

        //空引用
        //创建一个arr数组引用,指向null
        //此时的引用是一个无效的引用,此时不能针对这个引用进行[]操作,或者.操作
        //进行赋值或者是进行 == /!=是ok的
//         int [] arr1 = null;
//         int [] arr2 = arr1;
//        System.out.println(arr2 == arr1);//可以进行判断
//        System.out.println(arr1[0]);//Cannot load from int array because "arr1" is null
//          System.out.println(arr1.length);//Cannot read the array length because "arr1" is null

        //String字符串也是引用类型
//        String s = "hello";
//        String a = null;
//        System.out.println(s);
//        System.out.println(a);
//        int[] arr = {1, 2, 3};
//        swap(arr,1,0);
//        int [] arr = func4();
//        System.out.println(Arrays.toString(arr));

//        //字符串的拼接操作
//        String a = "hello";
////        String b = "world";
//        int b = 10;//遇到这种情况,会自动把int型转为string型
//        a += b;
//        System.out.println(a);
          int [] arr = {1,2,3};
//        int [] arr2 = Arrays.copyOf(arr,arr.length);//复制数组函数
//        int [] arr3 = Arrays.copyOfRange(arr,0,1);//相当于是前闭后开,编程中谈到的区间,大多都是这种情况
//        //区间中的元素个数直接是后一个减去前一个,便于计算,理解
//        System.out.println(toString(arr));
//        System.out.println(Arrays.toString(arr2));
//        System.out.println(Arrays.toString(arr3));

        //测试自己写的copeOf
//        int [] arr2 = copeOf(arr,2);
//        int [] arr3 = copeOf(arr,5);
//        System.out.println(Arrays.toString(arr2));
//        System.out.println(Arrays.toString(arr3));

        //测试自己写的元素查找
        int index = find(arr,5);
        int index2 = find(arr,3);//返回下标
        System.out.println(index);
        System.out.println(index2);
    }

    public static void func2(int[] a) {
        a[0] = 0;//会改变arr[0]的值
    }

    public static void func3(int[] a) {
         a = new int [] {100, 2, 3};//这个就不会改变,相当于是创建出来了一个新的数组,a的引用的地址也改变了,从右向左看
    }

    //返回数组
    public static int [] func4(){
        int [] a = {1,2,3};
        return a;
    }
    //temp无法交换int,但是可以交换同一个数组中的两个元素
    public static void swap(int [] arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    //模拟实现toString
    public static String toString(int [] arr){
        String result = "[";
        for(int i = 0;i < arr.length;i++) {
            result += arr[i];
            if (i < arr.length - 1)
                result += ", ";
        }
        result += "]";
        return result;
    }

    //模拟实现copeOf
    public static int [] copeOf(int [] arr,int newlength)
    {
        int len = (Math.min(arr.length, newlength));//可读性高,建议直接用这种
//        int len = (arr.length < newlength ? arr.length:newlength);
        int [] result = new int [newlength];
        for(int i = 0;i < len;i++){
            result[i] = arr[i];
        }
        return result;//这里注意直接写一个result就行,不用写result[];
    }

    //在数组中查找函数(返回的是下标)
    public static int find(int[] arr,int num){
        int f = 1;
        for(int i = 0;i < arr.length;i++){
            if (arr[i] == num)
                return i;
    }
        return -1;
    }

}
